

/*
 * 定义用来操作adb命令的帮助函数
 */


#ifndef __GND_ADB_HELPER_H__
#define __GND_ADB_HELPER_H__

#include <string>
#include <sigc++/slot.h>
#include <memory>
#include <list>
#include <giomm/memoryinputstream.h>

#include "Global.h"

namespace Gnodroid {

    /** 一个用来实现adb帮助函数的帮助类
     */
    class AdbHelper
    {
    public:

        /** 执行一个adb命令 exec a adb command
         * @param path adb可执行文件路径 adb executable file path
         * @param params adb命令的参数
         * @param std_out 命令的标准输出
         * @param std_error 命令的标准错误
         * @param ret_code 命令的返回值
         * @return 命令是否执行成功
         */
        static bool
        exec(std::string path, 
                std::string params,
                std::string* std_out = nullptr,
                std::string* std_error = nullptr,
                int* ret_code = nullptr);

        /** 获取当前设备列表
         * @param path adb可执行文件路径
         * @return 设备列表
         */
        static std::shared_ptr<std::list<DeviceInfo> >
        getDeviceList(std::string path);

        /** 检查adb可执行文件是否正确
         * @param path
         * @return
         */
        static bool 
        checkAdb(std::string path);

        /** 映射PC的端口到安卓设备的端口
         * @param path
         * @param id 设备ID
         * @param pcPort PC端口
         * @param anPort 安卓端口
         * @return
         */
        static bool 
        mapPort(std::string path,
                std::string id,
                int pcPort,
                int anPort);

        /** 弃用
         * @brief capScreen
         * @param path
         * @param id
         * @param data
         * @return
         */
        static bool
        capScreen(std::string path,
                  std::string id,
                  std::string& data);

        /** 获取屏幕截图
         * @param path
         * @param id 设备ID
         * @param inputStream 用来存放PNG截图数据
         * @return
         */
        static bool
        screenCap(std::string path,
                  std::string id,
                  Glib::RefPtr<Gio::MemoryInputStream> inputStream);

        /** 弃用
         * @brief startServer
         * @param path
         * @return
         */
        static bool
        startServer(std::string path);

        /** 安装应用程序
         * @param path
         * @param id
         * @param apkPath apk文件路径
         * @return
         */
        static bool
        installApp(std::string path,
                   std::string id,
                   std::string apkPath);

        /** 卸载应用程序
         * @param path
         * @param id
         * @param appPid 应用包名
         * @return
         */
        static bool
        uninstallApp(std::string path,
                     std::string id,
                     std::string appPid);

        /** 导出应用程序
         * @param path
         * @param id
         * @param appPid 应用包名
         * @param destPath 导出apk目标路径
         * @return
         */
        static bool
        exportApp(std::string path,
                  std::string id,
                  std::string appPid,
                  std::string destPath);
        
        
    };
}

#endif
